import axios from "axios";
import type { InternalAxiosRequestConfig, AxiosResponse } from "axios";
import { ElMessage } from "element-plus";
import { getToken, setToken, removeToken } from './auth'
import router from '@/router'

// 创建 axios 实例
const request = axios.create({
    baseURL: import.meta.env.VITE_APP_BASE_API,
    timeout: 4000000, // 增加超时时间到30秒
    headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    }
})
console.log(import.meta.env.VITE_APP_BASE_API)
// 请求拦截器
request.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        // 获取 token
        const token = getToken()
        if (token) {
            config.headers.Authorization = `Bearer ${token}`
        }
        return config
    },
    (error) => {
        console.error('请求错误:', error)
        return Promise.reject(error)
    }
)

// 响应拦截器
request.interceptors.response.use(
    (response: AxiosResponse) => {
          // 如果是文件下载，直接返回响应
          if (response.config.responseType === 'blob') {
            return response;
        }

        const { data } = response
        
        // 处理业务状态码
        if (data.code === 200) {
            return data
        } else {
            // 处理业务错误
            ElMessage({
                type: 'error',
                message: data.message || '请求失败'
            })
            
            // 处理 token 过期
            if (data.code === 401) {
                removeToken()
                router.push('/login')
            }
            
            return Promise.reject(new Error(data.message || '请求失败'))
        }
    },
    (error) => {
        // 处理 HTTP 错误
        let message = '请求失败'
        if (error.response) {
            switch (error.response.status) {
                case 401:
                    message = '未授权，请重新登录'
                    removeToken()
                    router.push('/login')
                    break
                case 403:
                    message = '拒绝访问'
                    break
                case 404:
                    message = '请求错误，未找到该资源'
                    break
                case 500:
                    message = '服务器端出错'
                    break
                default:
                    message = `连接错误${error.response.status}`
            }
        } else {
            message = '连接到服务器失败'
        }
        
        ElMessage({
            type: 'error',
            message
        })
        
        return Promise.reject(error)
    }
)

export default request;

